/*
 * Copyright 2008, Denis Zjukow.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.jemframework.domain;

public abstract class AbstractToOneRelation<SourceType extends Entity, PublicTargetType extends Entity> extends
    AbstractRelation<SourceType, PublicTargetType> {

  private PublicTargetType iTargetObject;

  public AbstractToOneRelation(SourceType aSourceObject) {
    super(aSourceObject);
  }

  public PublicTargetType getTargetObject() {
    return iTargetObject;
  }

  public void setTargetObject(PublicTargetType aTarget) {
    if (getTargetObject() != null && aTarget == null) {
      // The relation has contained a target, but should be reset (as the
      // parameter is set to null)
      // -> check whether the relation is bidirectional.
      if (isBidirectional()) {
        // The relation is bidirectional
        // -> reset the target object.
        resetTarget(getTargetObject());
      }
    }

    iTargetObject = aTarget;
  }

  @Override
  public void update() {
    if (isBidirectional() && getTargetObject() != null) {
      updateTarget(getTargetObject());
    }
  }
}
